#Verificando o diretorio que o R está direcionado
#getwd()
#Direcionado o R para o Diretorio a ser trabalhado
#setwd('/Users/jricardofl/Dropbox/tempecon/Facape/econometria1')
#Limpa o Ambiente Global
rm(list=ls())
#Pode usar dados de outros softwares
library(wooldridge)
library(ggplot2)
library(dplyr)
library(rstatix)Aula 2 - Introdução à Econometria
Modelos de Regressão Simples
Definição do Modelo de Regressão Simples
O modelo de regressão simples pode ser usado para estudar a relação entre duas variáveis. Em outras palavras, quando se pretender analisar como “y” varia quando “x” mudar;
Considere duas variáveis “y” e “x” que representam alguma população. A equação abaixo relaciona as duas variáveis:
\[ y=\beta_0+\beta_1x+u \]
A equação acima é válida para a população de interesse e chamada de modelo de regressão linear simples. Pode ser também chamada de regressão bivariada ou de duas variáveis.
Quando relacionadas como acima, as variáveis x e y* podem ser denominadas de diversas formas:
| Y | X |
|---|---|
| Variável Dependente | Variável Independente |
| Variável Explicada | Variável Explicativa |
| Variável de Resposta | Variável de Controle |
| Variável Prevista | Variável Previsora |
| Regressando | Regressor |
O termo covariável também pode ser usado para x. O mais comum é variável dependente e independente.
Se os outros fatores são fixos, sua variação é zero, ou seja, \(\Delta u=0\). Assim, x tem um efeito linear sobre y:
\[ \Delta y=\beta_1 \Delta x \quad se \quad \Delta u=0 \]
A variação em y é, simplesmente, \(\beta_1\) multiplicado pela variação em x. Isso significa que \(\beta_1\) é o parâmetro de inclinação da relação entre y e x, mantendo fixos os fatores em u;
O parâmetro de intercepto \(\beta_0\) é chamado de constante do modelo.
O coeficiente de inclinação mede a taxa (parcial) da mudança no valor médio de y para uma mudança de uma unidade no valor da variável independente, tudo o mais constante;
O termo de erro u representa todas aquelas variáveis que não podem estar explícitas no modelo por razões diversas. Contudo, se assume que a influência destas sobre o regressando é insignificante;
Pode-se entender o termo de erro como os fatores não observados que afetam y.
Hipóteses do Modelo Clássico de Regressão Linear
Em relação ao termo de erro, é necessário fazer uma hipótese que restrinja a relação dele com a variável independente (x);
Como u e x são variáveis aleatórias, pode-se definir a distribuição condicional de u dado qualquer valor de x. A hipótese para se estimar um modelo de regressão com betas confiáveis é
\[ E(u|x)=E(u)=0 \]
O que está indicado na equação acima é que o valor médio de u é o mesmo para qualquer valor de x e igual a sua média aritmética. Em outras palavras, diz que u é independente da média de x.
Considerando o valor esperado da equação de Y em função de X e usando \(E(u|x)=0\), se obtém:
\[ E(y|x)=\beta_0+\beta_1x \]
A equação dada acima mostra que a função de regressão populacional (FRP), \(E(y|x)\), é uma função linear de x;
A linearidade significa que o aumento de uma unidade em x faz com que o valor esperado de y varie segundo a magnitude de \(\beta_1\);
Para qualquer valor dado de x, a distribuição de y está centrada ao redor de \(E(y|x)\).
Fonte: WOOLDRIDGE, 2017
Derivação das estimativas de Mínimos Quadrados Ordinários (MQO)
Para estimar o Modelo de Regressão Linear, ou seja, encontrar os parâmetros \(\beta_0\) e \(\beta_1\) da primeira equação acima o método mais usado é o dos Mínimos Quadrados Ordinários (MQO), pois é intuitivamente e matematicamente mais simples;
Dado que um Modelo de Regressão:
\[ Y=\widehat{\beta}_0+\widehat{\beta}_1X+\widehat{u} \]
pode ser definido também como:
\[ \widehat{Y}=\widehat{\beta}_0+\widehat{\beta}_1X \]
em que o “chápeu” sobre Y, os betas e u enfatiza que os valores são estimativas.
Pode-se reescrever de forma que:
\[ Y=\widehat{Y}+\widehat{u} \]
ou ainda:
\[ \widehat{u}=Y-\widehat{Y} \]
então, um método bom para se obter as estimativas dos \(\beta\)s seria fazer com que a soma de todos os erros fosse a menor possível;
Fonte: WOOLDRIDGE, 2017
Por questões teóricas, o método dos Mínimos Quadrados Ordinários (MQO) minimiza a soma dos erros ao quadrado, dando peso diferente às observações cujo valor estimado esteja mais próximo ou mais distante do valor observado (\(Y\));
Assim, o que se precisa é minimizar uma função conhecida como Soma de Quadrados dos Resíduos (SQR):
\[ min \sum\widehat{u}^2=\sum(Y-\widehat{\beta}_0-\widehat{\beta}_1X)^2 \]
\[ \frac{\partial\sum u^2}{\partial \beta_0}=2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(-1)=-2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X) \]
\[ \frac{\partial\sum u^2}{\partial \beta_1}=2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(-X)=-2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X) \]
Igualando as derivadas a zero, tem-se
\[ -2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)=0 \]
\[ -2\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X)=0 \]
Se dividir tudo por -2N, tem-se
\[ \frac{\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)}{N}=0 \]
\[ \frac{\sum(Y-\hat{\beta_0}-\hat{\beta_1}X)(X)}{N}=0 \]
Usando o operador do somatório tem-se:
\[ \overline{Y}=\hat{\beta_0}+\hat{\beta_1}\overline{X} \]
\[ \hat{\beta_0}=\overline{Y}-\hat{\beta_1}\overline{X} \]
Uma vez que se tenha \(\hat{\beta_1}\), dados os valores das médias de Y e X se obtém o valor de \(\hat{\beta_0}\).
Considerando a outra equação, mas suprimindo o N, que não afeta a solução, se pode obter:
\[ \sum(Y-(\overline{Y}-\hat{\beta_1}\overline{X})-\hat{\beta_1}X)(X)=0 \]
\[ \sum(X)(Y-\overline{Y})=\sum(X)(-\hat{\beta_1}\overline{X})+\hat{\beta_1}X=0 \]
Como \(\hat{\beta_1}\) é uma constante e colocando em evidência:
\[ \sum(X)(Y-\overline{Y})=\hat{\beta_1}\sum(X)(X-\overline{X}) \]
Das propriedades do somatório, se tem que:
\[ \sum(X)(Y-\overline{Y})=\sum(X-\overline{X})(Y-\overline{Y}) \]
\[ \sum(X)(X-\overline{X})=\sum(X-\overline{X})^2 \]
Então, desde que \(\sum(X-\overline{X})^2>0\), a inclinação estimada é
\[ \hat{\beta_1}=\frac{\sum(X-\overline{X})(Y-\overline{Y})}{\sum(X-\overline{X})^2} \]
\[ \hat{\beta_1}=\frac{\sum xy}{\sum x^2} \]
com \(x=X-\overline{X}\) e \(y=Y-\overline{Y}\).
A equação dada em acima é a covariância amostral de x e y dividida pela variância amostral de x. Podemos reescrever a forma de encontrar o \(\hat{\beta}_1\) como abaixo:
\[ \hat{\beta_1}=\frac{cov(xy)}{\hat{\sigma}_x \hat{\sigma}_x}\frac{\hat{\sigma}_y}{\hat{\sigma}_y} \]
\[ \hat{\beta_1}=\frac{cov(xy)}{\hat{\sigma}_x \hat{\sigma}_y}\frac{\hat{\sigma}_y}{\hat{\sigma}_x} \]
\[ \hat{\beta_1}=\hat{\rho}_{xy}\frac{\hat{\sigma}_y}{\hat{\sigma}_x} \]
Em que \(\hat{\rho}_{xy}\) é a correlação amostral entre x e y; e \(\hat{\sigma}_y\) e \(\hat{\sigma}_x\) são os desvios padrões amostrais. Se a correlação de x e y for positiva, \(\hat\beta_1>0\) e se for negativa, \(\hat\beta_1<0\).
Uma vez determinados os estimadores de intercepto e inclinação de MQO (Mínimos Quadrados Ordinários), se constrói a reta de regressão de MQO:
\[ \hat{y}=\hat{\beta}_{0}+\hat{\beta}_{1}x \]
A função dada em acima é chamada de função de regressão amostral (FRA), pois ela é uma versão estimada da função de regressão populacional \(E(y|x)=\beta_{0}+\beta_1x\).
Como a FRA é obtida para determinada amostra de dados, uma amostra diferente irá gerar um intercepto e um coeficiente de inclinação diferentes.
Exemplo da Regressão Simples
Com os dados de CEOSAL1, estimar a regressão entre salario anual em milhares de dólares (salary) de diretores executivos e retorno médio sobre o patrimônio líquido (roe), que é dado como uma % do patrimônio líquido.
Exemplo no R
Diretório e Carregamento dos pacotes
Entrada dos dados
#Carregar dados no computador
ceolsal1 <- data('ceosal1')
#Observar a estrutura dos dados
glimpse(ceosal1)Rows: 209
Columns: 12
$ salary <int> 1095, 1001, 1122, 578, 1368, 1145, 1078, 1094, 1237, 833, 567…
$ pcsalary <int> 20, 32, 9, -9, 7, 5, 10, 7, 16, 5, 7, -3, -9, 9, 49, 4, 12, 9…
$ sales <dbl> 27595.0, 9958.0, 6125.9, 16246.0, 21783.2, 6021.4, 2266.7, 29…
$ roe <dbl> 14.1, 10.9, 23.5, 5.9, 13.8, 20.0, 16.4, 16.3, 10.5, 26.3, 25…
$ pcroe <dbl> 106.4, -30.6, -16.3, -25.7, -3.0, 1.0, -5.9, -1.6, -70.2, -23…
$ ros <int> 191, 13, 14, -21, 56, 55, 62, 44, 37, 37, 109, -10, 41, 44, 6…
$ indus <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ finance <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ consprod <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ utility <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ lsalary <dbl> 6.998509, 6.908755, 7.022868, 6.359574, 7.221105, 7.043160, 6…
$ lsales <dbl> 10.225389, 9.206132, 8.720281, 9.695602, 9.988894, 8.703075, …
tail(ceolsal1)[1] "ceosal1"
Estatística Descritiva
A primeira análise é sobre as estatísticas descritivas das duas variáveis.
attach(ceosal1)
#Estatistica Descritiva dos Dados
summary(salary) Min. 1st Qu. Median Mean 3rd Qu. Max.
223 736 1039 1281 1407 14822
summary(roe) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.50 12.40 15.50 17.18 20.00 56.30
# Gráfico de Dispersão dos dados
plot(salary ~ roe,
data = ceosal1,
main = "Gráfico de Dispersão de Salário e ROE",
ylab = "Salário",
xlab = "ROE")cor(salary, roe)[1] 0.1148417
Estimação do Modelo
A tarefa que enfrentamos agora é encontrar uma linha que melhor se ajuste aos dados. É claro que seria possível simplesmente ficar com a inspeção gráfica e a análise de correlação e, em seguida, selecionar a melhor linha de ajuste observando.
No entanto, isso seria bastante subjetivo: diferentes observadores traçariam diferentes linhas de regressão. Por conta disso, estamos interessados em técnicas menos arbitrárias. Tal técnica é dada pela estimativa de mínimos quadrados ordinários (MQO).
Em seguida, a análise de regressão simples com o cálculo dos betas de diversas formas:
#Estimar a regressao com intercepto
# computa beta_1_chapéu
beta_1 <- sum((roe - mean(roe)) * (salary - mean(salary))) / sum((roe - mean(roe))^2)
# computa beta_0_chapéu
beta_0 <- mean(salary) - beta_1 * mean(roe)
# mostra os resultados no Console
beta_1[1] 18.50119
beta_0[1] 963.1913
# Outra forma
regressao1 <- lm(salary ~ roe, data=ceosal1)
#Resultados da Regressao
summary(regressao1)
Call:
lm(formula = salary ~ roe, data = ceosal1)
Residuals:
Min 1Q Median 3Q Max
-1160.2 -526.0 -254.0 138.8 13499.9
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 963.19 213.24 4.517 1.05e-05 ***
roe 18.50 11.12 1.663 0.0978 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1367 on 207 degrees of freedom
Multiple R-squared: 0.01319, Adjusted R-squared: 0.008421
F-statistic: 2.767 on 1 and 207 DF, p-value: 0.09777
Gráfico do Modelo Estimado
g1 <- ggplot(data = ceosal1, aes(x = roe, y = salary)) +
geom_point() +
stat_smooth(method = "lm", col = "dodgerblue3") +
theme(panel.background = element_rect(fill = "white"),
axis.line.x=element_line(),
axis.line.y=element_line()) +
ggtitle("Modelo Linear Estimado")
g1Fazer previsão com base no modelo estimado
Com base no modelo estimado é possível fazer previsões. Se \(roe=30\), quanto seria o salário estimado?
predict(regressao1, data.frame(roe = 30)) 1
1518.227
Exemplo no Python
import wooldridge
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.formula.api as smf
#Carregar dados no computador
ceosal1 = wooldridge.data('ceosal1')
#Observar a estrutura dos dados
wooldridge.data('ceosal1', description=True)name of dataset: ceosal1
no of variables: 12
no of observations: 209
+----------+-------------------------------+
| variable | label |
+----------+-------------------------------+
| salary | 1990 salary, thousands $ |
| pcsalary | % change salary, 89-90 |
| sales | 1990 firm sales, millions $ |
| roe | return on equity, 88-90 avg |
| pcroe | % change roe, 88-90 |
| ros | return on firm's stock, 88-90 |
| indus | =1 if industrial firm |
| finance | =1 if financial firm |
| consprod | =1 if consumer product firm |
| utility | =1 if transport. or utilties |
| lsalary | natural log of salary |
| lsales | natural log of sales |
+----------+-------------------------------+
I took a random sample of data reported in the May 6, 1991 issue of
Businessweek.
# Estatística descritiva
ceosal1["salary"].describe()count 209.000000
mean 1281.119617
std 1372.345308
min 223.000000
25% 736.000000
50% 1039.000000
75% 1407.000000
max 14822.000000
Name: salary, dtype: float64
ceosal1["roe"].describe()count 209.000000
mean 17.184211
std 8.518509
min 0.500000
25% 12.400000
50% 15.500000
75% 20.000000
max 56.299999
Name: roe, dtype: float64
# Gráfico
# plot
plt.subplots()
#plt.scatter(ceosal1["roe"], ceosal1["salary"], data=ceosal1)
plt.scatter('roe', 'salary', data = ceosal1, c = "black")
plt.xlabel('ROE')
plt.ylabel('Salário')
plt.title('Gráfico de Dispersão de Salário e ROE')
plt.box(False)
plt.show()# Correlação
ceosal1["salary"].corr(ceosal1["roe"], method='pearson')0.11484173492695986
# Regressão Linear Simples
reg1 = smf.ols('salary ~ roe', data = ceosal1)
#Resultado da Regressão
reg1.fit().summary()| Dep. Variable: | salary | R-squared: | 0.013 |
| Model: | OLS | Adj. R-squared: | 0.008 |
| Method: | Least Squares | F-statistic: | 2.767 |
| Date: | Qui, 30 Mai 2024 | Prob (F-statistic): | 0.0978 |
| Time: | 19:44:49 | Log-Likelihood: | -1804.5 |
| No. Observations: | 209 | AIC: | 3613. |
| Df Residuals: | 207 | BIC: | 3620. |
| Df Model: | 1 | ||
| Covariance Type: | nonrobust |
| coef | std err | t | P>|t| | [0.025 | 0.975] | |
| Intercept | 963.1913 | 213.240 | 4.517 | 0.000 | 542.790 | 1383.592 |
| roe | 18.5012 | 11.123 | 1.663 | 0.098 | -3.428 | 40.431 |
| Omnibus: | 311.096 | Durbin-Watson: | 2.105 |
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 31120.902 |
| Skew: | 6.915 | Prob(JB): | 0.00 |
| Kurtosis: | 61.158 | Cond. No. | 43.3 |
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
reg1.fit().paramsIntercept 963.191336
roe 18.501186
dtype: float64
# Outra Opção de Output de Resultado
result = reg1.fit()
print(result.summary()) OLS Regression Results
==============================================================================
Dep. Variable: salary R-squared: 0.013
Model: OLS Adj. R-squared: 0.008
Method: Least Squares F-statistic: 2.767
Date: Qui, 30 Mai 2024 Prob (F-statistic): 0.0978
Time: 19:44:49 Log-Likelihood: -1804.5
No. Observations: 209 AIC: 3613.
Df Residuals: 207 BIC: 3620.
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 963.1913 213.240 4.517 0.000 542.790 1383.592
roe 18.5012 11.123 1.663 0.098 -3.428 40.431
==============================================================================
Omnibus: 311.096 Durbin-Watson: 2.105
Prob(Omnibus): 0.000 Jarque-Bera (JB): 31120.902
Skew: 6.915 Prob(JB): 0.00
Kurtosis: 61.158 Cond. No. 43.3
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
print("Parameters: ", result.params)Parameters: Intercept 963.191336
roe 18.501186
dtype: float64
print(result.params[0])963.1913364725581
print(result.params[1])18.50118634521493
y_hat = result.fittedvalues
u_hat = result.resid
print(y_hat)0 1224.058071
1 1164.854261
2 1397.969216
3 1072.348338
4 1218.507712
...
204 1129.702014
205 1249.959725
206 1187.055698
207 1216.657586
208 1229.608413
Length: 209, dtype: float64
print(u_hat)0 -129.058071
1 -163.854261
2 -275.969216
3 -494.348338
4 149.492288
...
204 -199.702014
205 -724.959725
206 -529.055698
207 -661.657586
208 -603.608413
Length: 209, dtype: float64
# Gráfico da regressão
sns.set_theme()
plt.figure(figsize = (20,8))
sns.regplot(x = 'roe', y = 'salary', data = ceosal1).set(title='Modelo Linear Estimado')
# Fazer Previsão com o modelo estimado
nova_obs = pd.DataFrame({"roe": [30]})
result.predict(nova_obs)0 1518.226927
dtype: float64